有全景照片,就會有全景影片。全景影片的製作方式跟照片類似,只不過讀取照片的方修改成讀取影片。這邊一開始也是需要準備一個360度的影片。
讀取影片:
struct ImmersiveView: View {
var body: some View {
RealityView { content in
let avPlayer = AVPlayer()
let url = Bundle.main.url(forResource: "video", withExtension: "mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let material = VideoMaterial(avPlayer: avPlayer)
let videoEntity = Entity()
videoEntity.components.set(ModelComponent(mesh: .generateSphere(radius: 1E3), materials: [material]))
videoEntity.scale *= SIMD3(-1, 1, 1)
videoEntity.orientation *= simd_quatf(angle: .pi / 2, axis: [0, 1, 0])
content.add(videoEntity)
avPlayer.replaceCurrentItem(with: playerItem)
avPlayer.play()
}
}
}
這段程式是讀取影片的方式,而這個影片是透過資源檔案方式儲存在專案內:
let avPlayer = AVPlayer()
let url = Bundle.main.url(forResource: "video", withExtension: "mp4")!
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
透過AVPlayer物件來播放影片,而AVPlayer只能播放AVPlayerItem物件,將讀取到的影片檔案透過AVAsset給予AVPlayerItem。
rootEntity.components.set:新增了一個半徑為1E3的球體,並且將材質設定為所建立的material。
videoEntity.scale = SIMD3(-1, 1, 1):將rootEntity的縮放沿x軸翻轉,使得球體的內部朝外。
videoEntity.orientation = simdquatf(angle: .pi / 2, axis: [0, 1, 0]):將videoEntity繞著Y軸旋轉90度。
回到程式進入點,在ImmersiveSpace加入屬性immersionStyle:
ImmersiveSpace(id: "ImmersiveSpace") {
ImmersiveView()
}
.immersionStyle(selection: .constant(.progressive), in: .progressive)
開啟App之後:
打開開關,就會有一個半圓弧的影片正在播放:
如果將immersionStyle設定為full:
ImmersiveSpace(id: "ImmersiveSpace") {
ImmersiveView()
}
.immersionStyle(selection: .constant(.full), in: .full)
就可以觀看一個完全360度的環景影片。
至此,「從 SwiftUI 到 Apple Vision Pro」的 30 天之旅也告一個段落,但這只是一開始,空間運算的應用與想像也可以很天馬行空,我們即將從2D的手機平面世界進入到完全3D的空間裡,這是一個全新的領域,也更是一個大挑戰。
期待,與您再次相會。
從 SwiftUI 到 Apple Vision Pro - SwiftUI 從零開始 Day30 [完]